package simpledb.storage;

import java.io.Serializable;

/**
 * 一个 RecordId 是对特定表的特定页面上的特定元组的引用
 */
public class RecordId implements Serializable {

    private static final long serialVersionUID = 1L;

    private final PageId      pageId;               // 页面ID，指向包含该记录的页面
    private final int         tupleNum;             // 元组编号，在页面内的位置

    /**
     * 创建一个新的 RecordId，指向指定的 PageId 和元组编号。
     *
     * @param pid 指定包含该元组的页面的PageId
     * @param tupleno 元组在页面中的编号
     */
    public RecordId(PageId pid, int tupleno) {
        this.pageId = pid;
        this.tupleNum = tupleno;
    }

    /**
     * 获取此 RecordId 引用的元组编号。
     *
     * @return 此 RecordId 引用的元组编号
     */
    public int getTupleNumber() {
        return this.tupleNum;
    }

    /**
     * 获取此 RecordId 引用的页面ID。
     *
     * @return 此 RecordId 引用的页面ID
     */
    public PageId getPageId() {
        return this.pageId;
    }

    /**
     * 如果两个 RecordId 对象表示相同的元组，则认为它们相等。
     *
     * @return 如果此对象和 o 表示同一个元组，则返回 true
     */
    @Override
    public boolean equals(Object o) {
        if (o == this) {
            return true;
        } else if (o instanceof RecordId) {
            RecordId another = (RecordId) o;
            return pageId.equals(another.getPageId()) && another.getTupleNumber() == tupleNum;
        } else {
            return false;
        }
    }

    /**
     * 应实现 hashCode() 方法，使得对于 equals() 相等的两个 RecordId 实例具有相同的 hashCode()。
     *
     * @return 对于 equals() 相同的 RecordId 对象，返回相同的整数值
     */
    @Override
    public int hashCode() {
        int result = 31 * pageId.hashCode() + tupleNum;
        return result;
    }
}
